﻿#include <iostream>
using namespace std;
//节点类型声明
struct Node
{
    int data;
    Node* next;
};
class List
{
private:
    //指向头节点的指针
    Node* phead;
public:
    //成员函数
    //构造函数
    List()
    {
        cout << "构造函数调用" << endl;
        phead = nullptr;
    }
    //析构函数-在结束时释放所有剩余节点
    ~List()
    {
        cout << "析构函数" << endl;
        while (phead)
        {
            PopFront();
        }
    }
    //创建节点
    Node* createNode(int data)
    {
        Node* newNode = new Node;
        newNode->data = data;
        newNode->next = nullptr;
        return newNode;
    }
    //打印链表
    void printList()
    {
        Node* cur = phead;
        while (cur != nullptr)
        {
            cout << cur->data << "-->";
            cur = cur->next;
        }
        cout << "nullptr" << endl;
        cout << endl;
    }
    //头部添加元素
    void PushFront(int data)
    {
        Node* newNode = createNode(data);
        newNode->next = phead;
        phead = newNode;
    }
    //头部删除元素
    void PopFront()
    {
        //空
        if (phead == nullptr)
        {
            cout << "链表为空，没有元素可以删除了" << endl;
            return;
        }
        //⾮空
        Node* tmp = phead;
        phead = phead->next;
        delete tmp;
        tmp = nullptr;
    }
    //尾部添加元素
    void PushBack(int x)
    {
        Node* newnode = createNode(x);
        // 1、空链表
        // 2、非空链表
        if (phead == nullptr)
        {
            phead = newnode;
        }
        else
        {
            Node* tail = phead;
            while (tail->next != nullptr)
            {
                tail = tail->next;
            }
            tail->next = newnode;
        }
    }
    //尾部删除元素
    void PopBack()
    {
        //空链表
        if (phead == nullptr)
        {
            cout << "链表为空，没有元素可以删除了" << endl;
            return;
        }
        // 1、⼀个节点
        // 2、⼀个以上节点
        if ((phead)->next == nullptr)
        {
            delete phead;
            phead = nullptr;
        }
        else
        {
            //找尾
            Node* tail = phead;
            while (tail->next->next != nullptr)
            {
                tail = tail->next;
            }
            delete tail->next;
            tail->next = nullptr;
        }
    }
    void DestropList()
    {
        while (phead)
        {
            PopFront();
        }
    }
};
int main()
{
    List list;
    list.PushBack(1);
    list.PushBack(2);
    list.PushBack(3);
    list.PushBack(4);
    list.printList();
    //头部删除并打印
    list.PopBack();
    list.printList();

    list.PopBack();
    list.printList();

    list.PopBack();
    list.printList();

    list.PopBack();
    list.printList();

    list.PopBack();
    list.printList();

    //头部添加元素
    list.PushFront(1);
    list.PushFront(2);
    list.PushFront(3);
    list.PushFront(4);
    list.printList();
    //头部删除
    list.PopFront();
    list.printList();
    list.PopFront();
    list.printList();
    return 0;
}
//Node* createNode(int data)
//{
//	Node* newNode = new Node;
//	newNode->data = data;
//	newNode->next = nullptr;
//	return newNode;
//
//}
//void printList(Node* p) {
//	while (p)
//	{
//		cout << p->data<<"->";
//		p = p->next;
//	}
//	cout << "NULL" << endl;
//}
//void PushFront(Node* &ph,int data)
//{
//		Node* pn = createNode(data);
//		pn->next = ph;
//		ph = pn;
//}
//void PushBack(Node* &ph,int data) 
//{
//	Node* pn = createNode(data);
//	//1、空链表
//	//2、非空链表
//	if (ph == NULL)
//	{
//		ph = pn;
//	}
//	else//非空
//	{
//		//1、找到最后一个节点
//		Node* tail = ph;
//		while (tail->next != NULL)
//		{
//			tail = tail->next;
//		}
//		//2、插入最后一个节点
//		tail->next = pn;
//	}
//}
//void PopFront(Node* phead) 
//{
//	//空
//	if (phead == NULL)
//	{
//		cout << "链表为空，没有元素可以删除了" << endl;
//		return;
//	}
//	//非空
//	Node* tmp = phead;
//	phead = phead->next;
//	delete tmp;
//	tmp = nullptr;
//}
//void PopBack(Node*& phead)
//{
//	//空链表
//	if (phead == nullptr)
//	{
//		cout << "链表为空，没有元素可以删除了" << endl;
//		return;
//	}
//	//1、⼀个节点
//	//2、⼀个以上节点
//	if (phead->next == nullptr)
//	{
//		free(phead);
//		phead = nullptr;
//	}
//	else
//	{
//		//找尾
//		Node* tail = phead;
//		while (tail->next->next != nullptr)
//		{
//			tail = tail->next;
//		}
//		free(tail->next);
//		tail->next = nullptr;
//	}
//}
//void DestropList(Node*& ph)
//{
//	while(ph)
//	{
//		PopFront(ph);
//	}
//}
//int main()
//{
//	Node* phead=NULL;
//	//头插
//	//PushFront(phead,1);
//	//PushFront(phead,2);
//	//PushFront(phead,3);
//	//PushFront(phead,4);
//	//printList(phead);
//	//尾插
//	PushBack(phead, 1);
//	PushBack(phead, 2);
//	PushBack(phead, 3);
//	PushBack(phead, 4);
//	printList(phead);
//	//头删
//	//PopFront(phead);
//	//printList(phead);
//
//	//PopFront(phead);
//	//printList(phead);
//	//
//	//PopFront(phead);
//	//printList(phead);
//	//
//	//PopFront(phead);
//	//printList(phead);
//
//	//尾删
//	PopBack(phead);
//	printList(phead);
//
//	PopBack(phead);
//	printList(phead);
//
//	PopBack(phead);
//	printList(phead);
//
//	PopBack(phead);
//	printList(phead);
//
//	return 0;
//}